// server.js
import express from 'express';
import fs from 'fs';
import path from 'path';
import { fileURLToPath } from 'url';
import cors from 'cors';
import multer from 'multer';

// 获取当前文件的目录名
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);

const app = express();
const PORT = process.env.PORT ? Number(process.env.PORT) : 3000;

// 视频文件目录
const VIDEO_DIR = process.env.VIDEO_DIR || path.join(__dirname, 'videos');

// 处理中文文件名编码问题的函数
function fixChineseFilename(filename) {
  try {
    // 方法1: 如果文件名包含问号或百分号，可能是编码问题
    if (filename.includes('?') || filename.includes('%')) {
      // 尝试URL解码
      const decoded = decodeURIComponent(filename);
      if (decoded !== filename && !decoded.includes('?')) {
        return decoded;
      }
    }
    
    // 方法2: 检查是否是Latin-1编码的UTF-8
    const latinBuffer = Buffer.from(filename, 'latin1');
    const utf8String = latinBuffer.toString('utf8');
    
    // 检查转换后是否包含中文字符
    if (/[\u4e00-\u9fff]/.test(utf8String)) {
      return utf8String;
    }
    
    // 方法3: 检查是否需要从binary转换
    if (filename.includes('â') || filename.includes('ã') || filename.includes('Â')) {
      const binaryBuffer = Buffer.from(filename, 'binary');
      const utf8FromBinary = binaryBuffer.toString('utf8');
      if (/[\u4e00-\u9fff]/.test(utf8FromBinary)) {
        return utf8FromBinary;
      }
    }
    
    // 如果所有方法都失败，返回原始文件名
    return filename;
  } catch (error) {
    return filename;
  }
}

// 确保视频目录存在
if (!fs.existsSync(VIDEO_DIR)) {
  console.log(`创建视频目录: ${VIDEO_DIR}`);
  try {
    fs.mkdirSync(VIDEO_DIR, { recursive: true });
  } catch (err) {
    console.error(`无法创建视频目录: ${err.message}`);
  }
}

// 配置文件上传
const storage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null, VIDEO_DIR);
  },
  filename: function (req, file, cb) {
    // 使用统一的中文文件名处理函数
    const originalName = file.originalname;
    const fixedName = fixChineseFilename(originalName);
    cb(null, fixedName);
  }
});

const upload = multer({ 
  storage: storage,
  limits: { fileSize: 500 * 1024 * 1024 }, // 限制文件大小为500MB
  fileFilter: function (req, file, cb) {
    // 检查文件类型
    const filetypes = /mp4|webm|ogg|mov|avi|wmv|mkv/;
    const mimetype = filetypes.test(file.mimetype);
    const extname = filetypes.test(path.extname(file.originalname).toLowerCase());
    
    if (mimetype && extname) {
      return cb(null, true);
    }
    
    cb(new Error('只支持视频文件格式!'));
  }
});

// 中间件
app.use(cors());
app.use(express.json({ charset: 'utf-8' }));
app.use(express.urlencoded({ extended: true, charset: 'utf-8' }));

// 提供静态文件访问
app.use('/videos', express.static(VIDEO_DIR));

// 获取视频列表
app.get('/api/videos', (req, res) => {
  try {
    // 确保目录存在
    if (!fs.existsSync(VIDEO_DIR)) {
      console.error(`目录不存在: ${VIDEO_DIR}`);
      return res.status(404).json({ error: '视频目录不存在' });
    }

    // 读取目录内容
    const files = fs.readdirSync(VIDEO_DIR, { encoding: 'utf8' });
    
    // 过滤视频文件并获取文件信息
    const videoFiles = files
      .filter(file => {
        const ext = path.extname(file).toLowerCase();
        return ['.mp4', '.webm', '.ogg', '.mov', '.avi', '.wmv', '.mkv'].includes(ext);
      })
      .map((file, index) => {
        const filePath = path.join(VIDEO_DIR, file);
        const stats = fs.statSync(filePath);
        
        // 处理可能的文件名编码问题
        const displayName = fixChineseFilename(file);
        
        // 计算文件大小的可读表示
        const fileSizeInBytes = stats.size;
        const fileSizeInMB = (fileSizeInBytes / (1024 * 1024)).toFixed(2);
        
        return {
          id: index + 1,
          video_name: displayName, // 使用处理后的显示名称
          video_address: `/videos/${encodeURIComponent(file)}`, // URL中使用原始文件名进行编码
          size: `${fileSizeInMB} MB`,
          createTime: stats.mtime.toLocaleString()
        };
      });
    
    console.log(`找到 ${videoFiles.length} 个视频文件`);
    res.json(videoFiles);
  } catch (error) {
    console.error('获取视频列表错误:', error);
    res.status(500).json({ error: '获取视频列表失败', message: error.message });
  }
});

// 删除视频文件
app.delete('/api/videos/:filename', (req, res) => {
  try {
    const filename = decodeURIComponent(req.params.filename);
    const filePath = path.join(VIDEO_DIR, filename);
    
    // 检查文件是否存在
    if (!fs.existsSync(filePath)) {
      return res.status(404).json({ error: '文件不存在' });
    }
    
    // 删除文件
    fs.unlinkSync(filePath);
    console.log(`已删除文件: ${filename}`);
    
    res.json({ 
      code: 200, 
      message: '文件删除成功',
      data: { filename }
    });
  } catch (error) {
    console.error('删除视频文件错误:', error);
    res.status(500).json({ error: '删除视频文件失败', message: error.message });
  }
});

// 上传视频文件
app.post('/api/videos/upload', upload.single('video'), (req, res) => {
  try {
    if (!req.file) {
      return res.status(400).json({ error: '没有收到文件' });
    }
    
    console.log(`文件上传成功: ${req.file.originalname}`);
    res.json({
      code: 200,
      message: '视频上传成功',
      data: {
        filename: req.file.originalname,
        size: req.file.size,
        path: req.file.path
      }
    });
  } catch (error) {
    console.error('上传文件错误:', error);
    res.status(500).json({ error: '上传文件失败', message: error.message });
  }
});

// 错误处理中间件
app.use((err, req, res, next) => {
  if (err instanceof multer.MulterError) {
    // Multer错误处理
    if (err.code === 'LIMIT_FILE_SIZE') {
      return res.status(400).json({ error: '文件大小超过限制' });
    }
    return res.status(400).json({ error: err.message });
  } else if (err) {
    // 其他错误
    return res.status(500).json({ error: err.message });
  }
  next();
});

// 启动服务器
app.listen(PORT, () => {
  console.log(`服务器已启动: http://localhost:${PORT}`);
  console.log(`视频目录: ${VIDEO_DIR}`);
}); 